package bean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;

import br.com.kapa.dao.DaoClienteBeanRemote;
import br.com.kapa.dao.DaoProdutoBeanRemote;
import br.com.kapa.dao.DaoSaidaProdutoBeanRemote;
import br.com.kapa.model.Cliente;
import br.com.kapa.model.Produto;
import br.com.kapa.model.SaidaProduto;
import fachada.Fachada;

@ManagedBean(name="saidaBean")
@SessionScoped
public class SaidaProdutoBean {

	private SaidaProduto saida;
	private DataModel<SaidaProduto> saidas;
	private int clienteSelecionado;
	private List<SelectItem> listaClientes;
	private int produtoSelecionado;
	private List<SelectItem> listaProdutos;
	private int quantidade;
	private Fachada fachada = Fachada.getInstance(); 
	
	public int getProdutoSelecionado() {return produtoSelecionado;}
	public void setProdutoSelecionado(int i) {produtoSelecionado = i;}
	public int getClienteSelecionado() {return clienteSelecionado;}
	public void setClienteSelecionado(int c) {clienteSelecionado = c;}
	public int getQuantidade() {return quantidade;}
	public void setQuantidade(int q) {quantidade=q;}
	public SaidaProduto getSaida() {return saida;}
	public void setSaida(SaidaProduto u) {saida = u;}
	
	public List<SelectItem> getListaProdutos() {
		setListaProdutos(getLista());
		return listaProdutos;
	}
	public void setListaProdutos(List<SelectItem> listaProdutos) {
		this.listaProdutos = listaProdutos;
	}
	
	public List<SelectItem> getListaClientes() {
		setListaClientes(getClienteItems());
		return listaClientes;
	}
	public void setListaClientes(List<SelectItem> listaClientes) {
		this.listaClientes = listaClientes;
	}
	public List<SelectItem> getLista() {
        ArrayList<SelectItem> lista = new ArrayList<SelectItem>();
        DaoProdutoBeanRemote dao = fachada.getDaoProduto(); 
        List<Produto> resultado = dao.findAll();
 
        for (Produto teste : resultado) {
            SelectItem item = new SelectItem(teste.getId(), teste.getDescricao());
            lista.add(item);
        }
        return lista;
	}	
	public List<SelectItem> getClienteItems() {
		ArrayList<SelectItem> lista = new ArrayList<SelectItem>();
		DaoClienteBeanRemote dao = fachada.getDaoCliente(); 
		List<Cliente> resultado = dao.findAll();
		
		for (Cliente c : resultado) {
			SelectItem item = new SelectItem(c.getId(), c.getNome());
			lista.add(item);
		}
		return lista;
	}	

	
	public DataModel<SaidaProduto> getSaidas() {
		DaoSaidaProdutoBeanRemote dao = fachada.getDaoSaidaProduto(); 
		List<SaidaProduto> lista = dao.findAll();
		saidas = new ListDataModel<SaidaProduto>(lista);
		return saidas;
	}
	
	public void salvar() {
		DaoSaidaProdutoBeanRemote dao = fachada.getDaoSaidaProduto(); 

		Cliente c = fachada.getDaoCliente().find(getClienteSelecionado());
		if (c != null ) saida.setCliente(c);
		
		try {
			FacesContext fc = FacesContext.getCurrentInstance();
			dao.persist(saida);
			fc.addMessage(null, new FacesMessage("Cadastro efetuado com sucesso", saida.getCliente().getNome()));			
			fachada.sendMessageToLog("Cadastrando saida para", saida.getCliente().getNome()); 			
		} catch (Exception e) {
			fachada.sendMessageToLog("Problemas adicionando saida", e.getMessage()); 
		}
	}
	
	public void load(ActionEvent e){
		saida = (SaidaProduto)(saidas.getRowData());
		setClienteSelecionado(saida.getCliente().getId());
	}
	
	public void create(ActionEvent e) {
		saida = new SaidaProduto();
	}
	public void update(ActionEvent e) {
		DaoSaidaProdutoBeanRemote dao = fachada.getDaoSaidaProduto(); 

		Cliente c = fachada.getDaoCliente().find(getClienteSelecionado());
		if (c != null ) saida.setCliente(c);
		
		FacesContext fc = FacesContext.getCurrentInstance();
		dao.merge(saida);
		fc.addMessage(null, new FacesMessage("Cadastro alterado com sucesso", saida.getCliente().getNome())); 
	}
	
	public void adicionarProduto(ActionEvent e) {
		DaoProdutoBeanRemote dao = fachada.getDaoProduto(); 
		Produto prod = dao.find(getProdutoSelecionado());
		if (prod != null) {
			getSaida().addItem(prod, getQuantidade());
		}
	}
	
}
